package io.gitee.loulan_yxq.owner.mybatisPlus.bean;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.MapType;
import io.gitee.loulan_yxq.owner.core.bean.BeanTool;
import io.gitee.loulan_yxq.owner.core.tool.ObjectTool;
import io.gitee.loulan_yxq.owner.json.tool.JsonTool;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*********************************************************
 **  mybatis的工具对象
 ** <br><br>
 ** Date: Created in 2021/9/14  16:39
 ** @author 楼兰
 ** @version 0.0.0
 *********************************************************/
public class MybatisBeanTool {

    /**
     * 对page对象进行复制
     *
     * @param source mybatis-plus里面的{@link Page}对象
     * @param clzz   要复制生成的的{@link Page}对象里面的{@link Page#setRecords(List)}实体的类的class
     * @return class类文件对应的Page对象
     * @author :loulan
     */
    public static <T> Page<T> copy(IPage<? extends Object> source, Class<T> clzz) {
        // 如果源对象为null，那么也就没有复制的必要了
        if (ObjectTool.isNull(source)) {
            return null;
        }

        JavaType javaType = JsonTool.getTypeFactory().constructParametricType(Page.class, clzz);
        return JsonTool.parse(JsonTool.toJsonBytes(source), javaType);
    }

    /**
     * 将page对象转换为{@code  Map<String, Object>}的Page对象
     *
     * @param source mybatis-plus里面的{@link Page}对象
     * @return {@code  Map<String, Object>}的Page对象
     * @author :loulan
     */
    public static Page<Map<String, Object>> copy(IPage<? extends Object> source) {
        // 如果源对象为null，那么也就没有复制的必要了
        if (ObjectTool.isNull(source)) {
            return null;
        }
        MapType mapType = JsonTool.getTypeFactory().constructMapType(HashMap.class, String.class, Object.class);
        JavaType javaType = JsonTool.getTypeFactory().constructParametricType(Page.class, JsonTool.getTypeFactory().constructType(mapType));
        return JsonTool.parse(JsonTool.toJsonBytes(source), javaType);
    }
}
